// 身份证省的编码
const idCityCode = {
  11: '北京',
  12: '天津',
  13: '河北',
  14: '山西',
  15: '内蒙古',
  21: '辽宁',
  22: '吉林',
  23: '黑龙江',
  31: '上海',
  32: '江苏',
  33: '浙江',
  34: '安徽',
  35: '福建',
  36: '江西',
  37: '山东',
  41: '河南',
  42: '湖北',
  43: '湖南',
  44: '广东',
  45: '广西',
  46: '海南',
  50: '重庆',
  51: '四川',
  52: '贵州',
  53: '云南',
  54: '西藏',
  61: '陕西',
  62: '甘肃',
  63: '青海',
  64: '宁夏',
  65: '新疆',
  71: '台湾',
  81: '香港',
  82: '澳门',
  91: '国外'
}

/**
 * 取身份证前两位,校验省份
 */
// eslint-disable-next-line camelcase
export function checkIDCard_province(card) {
  const province = card.substr(0, 2)
  if (idCityCode[province] === undefined) {
    return false
  }
  return true
}

/**
 * 校验身份证中生日是否正确
 */
// eslint-disable-next-line camelcase
export function checkIDCard_birthday(card) {
  const len = card.length
  // 身份证15位时，次序为省（3位）市（3位）年（2位）月（2位）日（2位）校验位（3位），皆为数字
  if (len === 15) {
    // eslint-disable-next-line camelcase
    const re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/
    // eslint-disable-next-line no-var, camelcase
    var arr_data = card.match(re_fifteen)
    // eslint-disable-next-line no-var, camelcase
    var year = arr_data[2]
    // eslint-disable-next-line no-var, camelcase
    var month = arr_data[3]
    // eslint-disable-next-line no-var, camelcase
    var day = arr_data[4]
    // eslint-disable-next-line no-var
    var birthday = new Date('19' + year + '/' + month + '/' + day)
    return verifyBirthday('19' + year, month, day, birthday)
  }
  // 身份证18位时，次序为省（3位）市（3位）年（4位）月（2位）日（2位）校验位（4位），校验位末尾可能为X
  if (len === 18) {
    // eslint-disable-next-line camelcase
    const re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/
    // eslint-disable-next-line no-var, no-redeclare, camelcase
    var arr_data = card.match(re_eighteen)
    // eslint-disable-next-line no-var, camelcase, no-redeclare
    var year = arr_data[2]
    // eslint-disable-next-line no-var, no-redeclare, camelcase
    var month = arr_data[3]
    // eslint-disable-next-line no-var, camelcase, no-redeclare
    var day = arr_data[4]
    // eslint-disable-next-line no-var, no-redeclare
    var birthday = new Date(year + '/' + month + '/' + day)
    return verifyBirthday(year, month, day, birthday)
  }
  return false
}

/**
 * 校验日期
 */
export function verifyBirthday(year, month, day, birthday) {
  const now = new Date()
  // eslint-disable-next-line camelcase
  const now_year = now.getFullYear()
  // 年月日是否合理
  if (birthday.getFullYear() === Number(year) && (birthday.getMonth() + 1) === Number(month) && birthday.getDate() === Number(day)) {
    // 判断年份的范围（3岁到100岁之间)
    // eslint-disable-next-line camelcase
    const time = now_year - year
    if (time >= 3 && time <= 100) {
      return true
    }
    return false
  }
  return false
}

/**
 * 身份证号码最后一位，检验位的检测
 */
export function checkParity(card) {
  // 15位转18位
  card = changeFivteenToEighteen(card)
  if (card.length === 18) {
    card = card.split('')
    // ∑(ai×Wi)(mod 11)
    // 加权因子
    const factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    // 校验位
    const parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
    let sum = 0
    let ai = 0
    let wi = 0
    for (let i = 0; i < 17; i++) {
      ai = card[i]
      wi = factor[i]
      sum += ai * wi
    }
    const last = parity[sum % 11]
    if (last === Number(card[17].toUpperCase())) {
      return true
    }
  }
  return false
}

/**
 * 15位转18位身份证号
 */
export function changeFivteenToEighteen(card) {
  if (card.length === '15') {
    const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    let cardTemp = 0; let i
    card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6)
    for (i = 0; i < 17; i++) {
      cardTemp += card.substr(i, 1) * arrInt[i]
    }
    card += arrCh[cardTemp % 11]
    return card
  }
  return card
}
